from PySide2.QtWidgets import *
from PySide2 import QtGui, QtCore
import sys
import pymysql


class Demo(QWidget):
    def __init__(self, parent=None):
        super(Demo, self).__init__(parent)
        self.initUI()

    def initUI(self):
        self.setWindowTitle("使用表格显示数据库中的数据")
        self.resize(490, 430)
        vhayout = QHBoxLayout()      # 创建水平布局
        table = QTableWidget()       # 创建表格
        # 连接数据库所需要的参数
        host = 'localhost'      # 服务器地址 (本机的ip地址)
        port = 3306             # 端口 （数据库的端口）
        db = 'choose'           # 数据库
        user = 'root'           # 用户名
        password = '123456'     # 密码
        # 连接数据库
        db = pymysql.connect(host=host, port=port, db=db, user=user, password=password)
        cursor = db.cursor()
        cursor.execute("select * from books")
        result = cursor.fetchall()
        row = cursor.rowcount        # 获取记录个数，用来设置表格的行数
        vol = len(result[0])         # 获取字段，用来设置表格的列数
        cursor.close()
        db.close()
        table.setRowCount(row)
        table.setColumnCount(vol)
        # 设置表格的标题名称
        table.setHorizontalHeaderLabels(['ID', '图书名称', '图书分类', '图书价格', '出版时间'])
        for i in range(row):
            for j in range(vol):
                if j == 4:
                    data = QTableWidgetItem(QtGui.QIcon('日历.png'), str(result[i][j]))
                else:
                    if j == 2:       # 在图书分类中的某个单元格中添加组件
                        comobox = QComboBox()
                        comobox.addItems(['Python', 'Java', 'C', 'C++'])
                        comobox.setCurrentIndex(0)
                        table.setCellWidget(0, 2, comobox)
                    data = QTableWidgetItem(str(result[i][j]))    # 将数据库中的数据转换后插入表格
                data.setForeground(QtGui.QBrush(QtGui.QColor('green')))   # 设置数据颜色
                table.setItem(i, j, data)
        table.resizeColumnsToContents()           # 使列宽随内容变换而变换
        table.resizeRowsToContents()              # 使行高度随内容变换而变换
        table.setAlternatingRowColors(True)       # 使表格颜色交错
        table.verticalHeader().setVisible(False)    # 隐藏垂直标题（左侧那一列序号删除了）
        table.horizontalHeader().setStretchLastSection(True)   # 设置最后一列自动填充容器
        # table.sortItems(4, QtCore.Qt.DescendingOrder)      # 将最后一列出版时间按降序排列（且同一行会一起变动）
        # 合并单元格
        table.setSpan(0, 2, 5, 1)      # 0表示第一行，2表示第三列，5表示跨了五行，1表示跨了一列
        table.setSpan(2, 3, 3, 1)
        table.setSpan(2, 4, 3, 1)
        vhayout.addWidget(table)                  # 将表格添加到水平布局中
        self.setLayout(vhayout)                   # 设置当前窗口的布局


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

